#ifndef METRONOMO_H
#define METRONOMO_H

#include <QSound>
#include <windows.h>
#include "notacompas.h"

class ContadorTiempo {
public:
    ContadorTiempo() {
        inicializar();
    }

    void inicializar() {
        QueryPerformanceFrequency(&ticksPorSegundo);
        QueryPerformanceCounter(&tickInicial);
    }

    unsigned long long getMicrosegundosTranscurridos() const {
        LARGE_INTEGER tickActual;
        QueryPerformanceCounter(&tickActual);
        return (tickActual.QuadPart - tickInicial.QuadPart) / (ticksPorSegundo.QuadPart / 1000000);
    }

    unsigned long long getMilisegundosTranscurridos() const {
        return getMicrosegundosTranscurridos() / 1000;
    }

    unsigned long long getSegundosTranscurridos() const {
        return getMicrosegundosTranscurridos() / 1000000; 
    }

private:
    LARGE_INTEGER ticksPorSegundo;
    LARGE_INTEGER tickInicial;
};

class Metronomo 
{
public:
    Metronomo();
    ~Metronomo();

    void arrancar();
    void parar();

	void setTempo(int tempo) { this->tempo = tempo; }
	int getTempo() { return tempo; }

	void setPulsosPorCompas(int pulsosPorCompas) { this->pulsosPorCompas = pulsosPorCompas; }

	double getProporcionCompletadoCompas();

	unsigned long long getMilisegundosDesdeInicio();

	double getMilisegundosPorCompas() { return milisegundosPorCompas; }
	double getMilisegundosPorPulso() { return milisegundosPorPulso; }

	unsigned long long getMilisegundoInicioCompas();

	void setReproducirSonido(bool reproducir) {
		this->reproducirSonido = reproducir;
	}

	bool getReproducirSonido() {
		return reproducirSonido;
	}

	void comprobarSonido();

	void actualizar();

private:
    int tempo;
    int pulsosPorCompas;    
	bool activo;
	bool reproducirSonido;

	ContadorTiempo contadorTiempo;

	double milisegundosPorCompas;
	double milisegundosPorPulso;
	
	int ultimoPulsoEjecutado;

	QSound* sonido1;
	QSound* sonido2;

};

#endif // METRONOMO_H
